//
//  Man.m
//  07 - 内存管理
//
//  Created by 韩旭 on 16/7/12.
//  Copyright © 2016年 基础. All rights reserved.
//

#import "Man.h"

@implementation Man
//以下修饰的都是MRC下的setter方法

//assign下修饰的属性的setter方法
- (void)setNumber:(NSInteger)number {
    _number = number;
}
// retain修饰的属性的setter方法
- (void)setName:(NSString *)name {
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
}
// copy修饰的属性的setter方法
- (void)setID:(NSString *)ID {
    if (_ID != ID) {
        [_ID release];
        _ID = [ID copy];
    }
}
- (void)dealloc {
    NSLog(@"对象被释放了");
//    释放所有生成成员变量（语义设置 retain 和 copy 需要释放）
    [_name release];
    [_ID release];
    [_sexual release];
    [_gayBoy release];
    [_des release];

    [super dealloc];
}

- (id)copyWithZone:(NSZone *)zone {
//    开辟新的空间 , 创建一个新的对象
    Man *man = [[Man allocWithZone:zone] init];
//    浅拷贝, 只创建了新的对象, 但是所所有的额属性还指向原来的属性
    man.name = self.name;
    man.sexual = self.sexual;
//    深拷贝, 不知创建新的对象, 对象所偶有的属性, 也对应的拷贝一份新的
    man.name = [self.name copy];
    man.sexual = [self.sexual copy];
    return man;
}

// 协议方法的实现， 是签订者的实现中（@implementation）中
- (void)sayHello {
    NSLog(@"Hello, I'm Gay");
}
// 赋值用的
// 在这个方法中, 编写找不到key值得处理措施
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    if ([key isEqualToString:@"id"]) {
        self.ID = value;
    }
    if ([key isEqualToString:@"description"]) {
        self.des = value;
    }
}
// 取值用的
- (id)valueForUndefinedKey:(NSString *)key {
    return nil;
}

@end
